const obj = { name: 'John', age: 30, city: 'New York' }

// 获取普通对象所有的键
console.log(Object.keys(obj)) // [ 'name', 'age', 'city' ]

// 获取普通对象所有的值
console.log(Object.values(obj)) // [ 'John', 30, 'New York' ]

// 获取包含该对象所有 [key, value] 键值对的数组
console.log(Object.entries(obj)) // [ [ 'name', 'John' ], [ 'age', 30 ], [ 'city', 'New York' ] ]

// * map.keys() 返回的是可迭代对象，而 Object.keys(obj) 返回的是真正的数组。

// **********************************************************************************************************

const obj1 = {
	name: 'John',
	[Symbol('age')]: 30,
	[Symbol('city')]: 'shanghai',
}

// 无法遍历出 Symbol 类型的属性
for (const key in obj1) {
	console.log(key) // name
}

// 只返回 Symbol 类型的属性
console.log(Object.getOwnPropertySymbols(obj1)) // [ Symbol(age), Symbol(city) ]

// 返回所有的键，包含 Symbol 键。Object.keys() 无法返回 Symbol 类型的属性。
console.log(Reflect.ownKeys(obj1)) // [ 'name', Symbol(age), Symbol(city) ]

// **********************************************************************************************************

// 转换对象的例子：
let prices = {
	banana: 1,
	apple: 2,
	meat: 4,
}

// 将键值对的二维数组转为对象
let doublePrices = Object.fromEntries(
	// 将对象转为 [key, value] 键值对的二维数组
	Object.entries(prices).map(([key, value]) => [key, value * 2])
)

console.log(doublePrices.meat) // 8
